package com.xhu.util;

import java.io.*;
import java.nio.charset.StandardCharsets;
import java.util.*;

/*利用标记中属性赋值号“＝”左右添加空格来隐藏信息。
  以左右都无空格表示00，左无右有空格表示01，左有右无空格表示10，左右均有空格表示11，
  则一个属性赋值可隐藏2bit信息。*/
public class HideHtml {

    public static int LEN = 10;

    public static String DESPSW = "12345678";
    /**
     *  将二进制密文的长度信息添加到二进制密文的前面
     * @param content   二进制密文的字符串
     * @return Queue<Character>
     */
    public static Queue<Character> getMessage(String content, String type){
        //使用DES加密
        content = DESUtil.encrypt(DESPSW, content);
        //使用base64对内容进行加密
        String base64encodedString = Base64.getEncoder().encodeToString(content.getBytes(StandardCharsets.UTF_8));
        //将加密内容转化为二进制字符串
        String binContent = BinaryStringConverteUtil.toBinaryString(base64encodedString);

        Queue<Character> mes = new LinkedList<>();
        //确定二进制内容的长度
        int conLens = binContent.length();
        //将长度转化为二进制字符串A
        String lens = Integer.toBinaryString(conLens);
        //对二进制字符串进行补位
        int n = HideHtml.LEN-lens.length();
        if(n>0){
            String pad = String.join("",Collections.nCopies(n,"0"));
            lens = pad + lens;
        }

        String message = "0" + type + lens + binContent;
        System.out.println("================" + message);
        for (int i = 0; i < message.length(); i++) {
            mes.offer(message.charAt(i));
        }
        return mes;
    }

    /**
     * 获取html文件的内容
     * @param fileName 文件路径
     * @return 返回html的所有内容。list中每一个StringBuilder对应html文件中每一行的内容
     * @throws IOException
     */
    public static List<StringBuilder> getHtmlContents(String fileName, boolean isHide) throws IOException {
        //建立文件内容接收容器
        List<StringBuilder> contents = new ArrayList<>();
        //创建html文件对象
        File htmlFile = new File(fileName);
        //建立文件读取流
        BufferedReader br = new BufferedReader(new FileReader(htmlFile));;
        try {
            String s = null;
            //使用readLine方法，一次读一行
            while((s = br.readLine())!=null){
                // TODO: 2021/3/29 为了解决“=”自带空格和多个等号在一起
                if(isHide){
                    s = s.replaceAll("( *)(=)( *)", "=").replaceAll("=+","=");
                }
                contents.add(new StringBuilder(s));
            }
        }catch (Exception e){
            e.printStackTrace();
        }finally {
            //关闭文件读取流
            br.close();
        }
        return contents;
    }
}

